import { readFile } from "node:fs/promises"; import { join } from "node:path"; import { ImageResponse } from "next/og"; import type { NextRequest } from "next/server"; import { getPageImage, source } from "@/lib/geistdocs/source"; export const GET = async ( _request: NextRequest, { params }: RouteContext<"/[lang]/og/[...slug]"> ) => { const { slug, lang } = await params; const page = source.getPage(slug.slice(0, -1), lang); if (!page) { return new Response("Not found", { status: 404 }); } const { title, description } = page.data; const regularFont = await readFile( join(process.cwd(), "app/[lang]/og/[...slug]/geist-sans-regular.ttf") ); const semiboldFont = await readFile( join(process.cwd(), "app/[lang]/og/[...slug]/geist-sans-semibold.ttf") ); const backgroundImage = await readFile( join(process.cwd(), "app/[lang]/og/[...slug]/background.png") ); const backgroundImageData = backgroundImage.buffer.slice( backgroundImage.byteOffset, backgroundImage.byteOffset + backgroundImage.byteLength ); return new ImageResponse(
{/** biome-ignore lint/performance/noImgElement: "Required for Satori" */} Vercel OpenGraph Background
{title}
{description}
, { width: 1200, height: 628, fonts: [ { name: "Geist", data: regularFont, weight: 400, }, { name: "Geist", data: semiboldFont, weight: 500, }, ], } ); }; export const generateStaticParams = async ({ params, }: RouteContext<"/[lang]/og/[...slug]">) => { const { lang } = await params; return source.getPages(lang).map((page) => ({ lang: page.locale, slug: getPageImage(page).segments, })); };